﻿using System.Collections.Generic;
using System.Linq;
using Controller2.Models;
using System;
using System.Data;

namespace Controller2.BLL
{
    public class CampanhaBll
    {
        public static Campanha GetCampanha(ControllerBDModelContainer db, int id)
        {
            return db.Campanha.FirstOrDefault(c => c.IdCampanha == id);
        }

        public static IEnumerable<Campanha> GetAllCampanhas(ControllerBDModelContainer db)
        {
            return (from c in db.Campanha orderby c.Nome select c).OrderBy(c => c.Nome).ToList();
        }

        public static IEnumerable<Campanha> GetAllCampanhasPorCliente(ControllerBDModelContainer db, int id)
        {
            return (from c in db.Campanha where c.IdCliente == id orderby c.Nome select c).OrderBy(c => c.Nome).ToList();
        }

        public static DataTable Relatorios(ControllerBDModelContainer db, int codigo, string dataInicial, string dataFinal, bool cliente = false)
        {
            IEnumerable<Campanha> lista;
            if (codigo > 0 && !cliente)
            {
                lista = (from c in db.Campanha
                         where c.IdCampanha == codigo
                         orderby c.DataCadastro
                         select c
                         ).OrderBy(c => c.DataCadastro).ToList();
            }
            else if (codigo > 0 && cliente)
            {
                lista = (from c in db.Campanha
                         where c.IdCliente == codigo
                         orderby c.DataCadastro
                         select c
                         ).OrderBy(c => c.DataCadastro).ToList();
            }
            else if (!string.IsNullOrWhiteSpace(dataInicial))
            {
                var di = Convert.ToDateTime(dataInicial);
                var df = Convert.ToDateTime(dataFinal);
                lista = (from c in db.Campanha
                         where c.DataInicio >= di && c.DataFim <= df
                         orderby c.DataCadastro
                         select c
                         ).OrderBy(c => c.DataCadastro).ToList();
            }
            else
            {
                lista = (from c in db.Campanha
                         orderby c.DataCadastro
                         select c
                         ).OrderBy(c => c.DataCadastro).ToList();
            }

            var dt = new DataTable();
            dt.Columns.Add("DataCadastro", typeof(DateTime));
            dt.Columns.Add("IdCampanha", typeof(Int32));
            dt.Columns.Add("Nome", typeof(String));
            dt.Columns.Add("NomePessoa", typeof(String));
            dt.Columns.Add("DataInicio", typeof(DateTime));
            dt.Columns.Add("DataFim", typeof(DateTime));

            foreach (Campanha c in lista)
            {
                DataRow r = dt.NewRow();
                r["DataCadastro"] = c.DataCadastro;
                r["IdCampanha"] = c.IdCampanha;
                r["Nome"] = c.Nome;
                r["NomePessoa"] = c.Cliente.NomePessoa;
                r["DataInicio"] = c.DataInicio;
                r["DataFim"] = c.DataFim;
                dt.Rows.Add(r);
            }
            return dt;
        }

        /// <summary>
        /// Faz o autocomplete do campo de texto de pesquisa
        /// </summary>
        /// <param name="db">Contexto de dados</param>
        /// <param name="filtro">Valor do filtro (combobox)</param>
        /// <param name="termoPesquisa">Termo da pesquisa (valor digitado)</param>
        /// <param name="numeroLinhas">Número de registros a serem mostrados</param>
        /// <returns></returns>
        public static IEnumerable<string> AutoComplete(ControllerBDModelContainer db, int filtro, string termoPesquisa, int numeroLinhas)
        {
            IEnumerable<string> resultado;
            int codigo = 0;
            if (filtro == 1)
            {
                if (!int.TryParse(termoPesquisa, out codigo))
                {
                    filtro = 2;
                }
            }
            switch (filtro)
            {
                default:
                    resultado = (from c in db.Campanha.ToList()
                                 where c.IdCampanha >= codigo
                                 select c.IdCampanha.ToString()).Distinct();
                    break;
                case 2:
                    resultado = (from c in db.Campanha
                                 where c.Nome.Contains(termoPesquisa)
                                 select c.Nome).Distinct();
                    break;
            }
            return resultado.Take(numeroLinhas);
        }
    }
}